"""
JWT工具函数 - 生成、验证和解析JWT令牌
"""
import jwt
import time
from django.conf import settings
from typing import Optional, Dict


# JWT密钥（生产环境应该使用环境变量）
JWT_SECRET_KEY = getattr(settings, 'JWT_SECRET_KEY', settings.SECRET_KEY)
JWT_ALGORITHM = 'HS256'
JWT_EXPIRY_SECONDS = getattr(settings, 'JWT_EXPIRY_SECONDS', 7 * 24 * 3600)  # 默认7天


def generate_jwt_token(user_id: int, username: str) -> str:
    """
    生成JWT令牌
    
    Args:
        user_id: 用户ID
        username: 用户名
    
    Returns:
        JWT令牌字符串
    """
    payload = {
        'user_id': user_id,
        'username': username,
        'exp': int(time.time()) + JWT_EXPIRY_SECONDS,  # 过期时间
        'iat': int(time.time()),  # 签发时间
    }
    
    token = jwt.encode(payload, JWT_SECRET_KEY, algorithm=JWT_ALGORITHM)
    return token


def verify_jwt_token(token: str) -> Optional[Dict]:
    """
    验证JWT令牌
    
    Args:
        token: JWT令牌字符串
    
    Returns:
        如果验证成功，返回解析后的payload字典；否则返回None
    """
    try:
        payload = jwt.decode(token, JWT_SECRET_KEY, algorithms=[JWT_ALGORITHM])
        return payload
    except jwt.ExpiredSignatureError:
        # 令牌已过期
        return None
    except jwt.InvalidTokenError:
        # 令牌无效
        return None


def decode_jwt_token(token: str) -> Optional[Dict]:
    """
    解析JWT令牌（不验证过期时间）
    
    Args:
        token: JWT令牌字符串
    
    Returns:
        解析后的payload字典，如果令牌无效则返回None
    """
    try:
        payload = jwt.decode(
            token, 
            JWT_SECRET_KEY, 
            algorithms=[JWT_ALGORITHM],
            options={"verify_exp": False}  # 不验证过期时间
        )
        return payload
    except jwt.InvalidTokenError:
        return None


def refresh_jwt_token(token: str) -> Optional[str]:
    """
    刷新JWT令牌
    
    Args:
        token: 旧的JWT令牌
    
    Returns:
        新的JWT令牌，如果旧令牌无效则返回None
    """
    payload = decode_jwt_token(token)
    if not payload:
        return None
    
    # 生成新令牌
    new_token = generate_jwt_token(
        user_id=payload['user_id'],
        username=payload['username']
    )
    return new_token

